<template>
  <div class="better-scroll-container">
    <el-row :gutter="20">
      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
        动画时长
        <el-slider
          v-model="time"
          style="width: 300px"
          :min="100"
          :max="3000"
        ></el-slider>

        <el-button @click="handleScrollTo(100)">滚动到100像素位置</el-button>
        <el-button @click="handleScrollTo(300)">滚动到300像素位置</el-button>
        <el-button @click="handleScrollBy(100)">向下滚动100像素</el-button>
        <el-button @click="handleScrollBy(-50)">向上滚动50像素</el-button>
        <el-button @click="handleScrollToElement(15)">滚动到第15个</el-button>
        <el-button @click="handleScrollToElement(25)">滚动到第25个</el-button>
      </el-col>
      <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
        <div ref="wrapper" class="right-content">
          <ul>
            <li v-for="n in 100" :id="`bs-item-${n}`" :key="n">n : {{ n }}</li>
          </ul>
        </div>
      </el-col>
    </el-row>
  </div>
</template>

<script>
  import BScroll from "better-scroll";

  export default {
    name: "BetterScroll",
    data() {
      return {
        time: 1000,
        BS: null,
      };
    },
    mounted() {
      this.scrollInit();
    },
    beforeDestroy() {
      this.scrollDestroy();
    },
    methods: {
      handleScrollTo(y) {
        this.BS.scrollTo(0, -y, this.time);
      },
      handleScrollBy(y) {
        this.BS.scrollBy(0, -y, this.time);
      },
      handleScrollToElement(n) {
        this.BS.scrollToElement(`#bs-item-${n}`, this.time);
      },
      scrollInit() {
        this.BS = new BScroll(this.$refs["wrapper"], {
          mouseWheel: true,
          scrollbar: {
            fade: true,
            interactive: false,
          },
        });
      },
      scrollDestroy() {
        if (this.BS) {
          this.BS.destroy();
        }
      },
    },
  };
</script>
<style lang="scss" scoped>
  .better-scroll-container {
    .right-content {
      height: 500px;
      margin-top: 40px;
      overflow: hidden;
    }
  }
</style>
